package com.example.exceldemo.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.example.exceldemo.model.DemoData;
import com.example.exceldemo.utils.ExcelUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: [java类作用描述]
 * @Author: jiangzhihong
 * @CreateDate: 2021/11/7 22:47
 */
@RestController
@RequestMapping("/demo")
public class TestExcelContrller {
    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>1. 创建excel对应的实体对象 参照{@link }
     * <p>2. 设置返回的 参数
     * <p>3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @PostMapping("/download")
    public void download() throws IOException {
        // 设置头信息
        HttpServletResponse response = ExcelUtils.solveHeaderInfo();

        // 填充假数据
        List<DemoData> resultList = fillDate();

        // 导出
        EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(resultList);
    }

    /**
     * 填充数据
     * @author: jiangzhihong
     * @date: 2021/11/11 22:29
     */
    private List<DemoData> fillDate() {
        List<DemoData> resultList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData demoData = new DemoData();
            demoData.setString("title" + i);
            demoData.setDoubleData(i * 1.1D);
            resultList.add(demoData);
        }
        return resultList;
    }

    /**
     * 文件上传
     * <p>1. 创建excel对应的实体对象 参照{@link }
     * <p>2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听器，参照{@link }
     * <p>3. 直接读即可
     */
    @PostMapping("/upload")
    @ResponseBody
    public void upload(MultipartFile file) throws IOException {
        List<DemoData> resultList = new ArrayList<>();
        // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(file.getInputStream(), DemoData.class, new PageReadListener<DemoData>(dataList -> {
            for (DemoData demoData : dataList) {
                System.out.println(demoData.toString());
                resultList.add(demoData);
            }
        })).sheet().doRead();
    }
}
